/**
 * 能够被for...of正常遍历的，都需要实现一个遍历器Iterator。
 * 数组、字符串、Set、Map结构，早就内置好了Iterator（迭代器），
 * 它们的原型中都有一个Symbol.iterator方法，它们可以，
 * 而Object对象并没有实现这个接口，使得它无法被for...of遍历。

 * @type {string[]}
 */

const arr = ['a','b','c']
for(let value of arr){
    console.log(value)
}
// a
// b
// c


console.log(Array.prototype[Symbol.iterator]) // [Function: values]
console.log(String.prototype[Symbol.iterator]) // [Function: [Symbol.iterator]]
console.log(Set.prototype[Symbol.iterator])// [Function: values]
console.log(Map.prototype[Symbol.iterator]) // [Function: entries]
console.log(Object.prototype[Symbol.iterator]) //undefined

//如何让对象可以被for of 遍历，当然是给它添加遍历器
//在对象的原型上直接添加迭代器
Object.prototype[Symbol.iterator] = function(){
    const _this = this
    const keys = Object.keys(this)
    let index = 0
    return {
        next(){
            return {
                value: _this[keys[index++]],
                done: index>keys.length
            }
        }
    }
}
console.log(Object.prototype[Symbol.iterator]) //undefined
//使用：
var myObject = { a: 1, b: 2, c: 3 };
for(let item of myObject){//这就像myObject本来就支持for...of一样
    console.log(item)
}
